/*
 * ******************************************************************************
 *   Copyright (c) 2013-2014 Gabriele Mariotti.
 *
 *   Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
 *   You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *   limitations under the License.
 *  *****************************************************************************
 */

package it.gmariotti.cardslib.library.view;


import it.gmariotti.cardslib.library.Constants;
import it.gmariotti.cardslib.library.internal.CardGridArrayAdapter;
import it.gmariotti.cardslib.library.internal.CardGridCursorAdapter;
import it.gmariotti.cardslib.library.ResourceTable;
import it.gmariotti.cardslib.library.view.base.CardViewWrapper;
import ohos.agp.components.AttrSet;
import ohos.agp.components.BaseItemProvider;
import ohos.agp.components.Component;
import ohos.agp.components.ListContainer;
import ohos.app.Context;

import ohos.hiviewdfx.HiLog;

/**
 * Card Grid View.
 * It uses an {@link CardGridArrayAdapter} to populate items.
 * </p>
 * Usage:
 * It provides a default layout id for each row @layout/list_card_layout
 * Use can easily customize it using ohos:list_card_layout_resourceID attr in your xml layout.
 * </p>
 * Use this code to populate the grid view
 * <pre><code>
 * CardGridView gridView = (CardGridView) getAbility().findViewById(ResourceTable.Id_gridId);
 * gridView.setAdapter(mCardGridArrayAdapter);
 * </code></pre>
 * This type of view, doesn't support swipe and collapse/expand actions.
 * </p>
 * Currently you have to use the same inner layout for each card in gridView.
 * </p>
 *
 * @author Gabriele Mariotti (gabri.mariotti@gmail.com)
 */
public class CardGridView extends ListContainer implements CardViewWrapper.OnExpandListAnimatorListener {

    protected static String TAG = "CardGridView";

    /**
     * Card Grid Array Adapter
     */
    protected CardGridArrayAdapter mAdapter;

    /**
     * Card Cursor Adapter
     */
    protected CardGridCursorAdapter mCursorAdapter;

    //--------------------------------------------------------------------------
    // Custom Attrs
    //--------------------------------------------------------------------------

    /**
     * Default layout to apply to card
     */
    protected int list_card_layout_resourceID = ResourceTable.Layout_list_card_layout;

    //--------------------------------------------------------------------------
    // Constructors
    //--------------------------------------------------------------------------


    public CardGridView(Context context) {
        this(context,null);
        init(null, 0);
    }

    public CardGridView(Context context, AttrSet attrs) {
        this(context, attrs,"0");
        init(attrs, 0);
    }

    public CardGridView(Context context, AttrSet attrs, String defStyle) {
        super(context, attrs, defStyle);

    }

    //--------------------------------------------------------------------------
    // Init
    //--------------------------------------------------------------------------

    /**
     * Initialize
     *
     * @param attrs
     * @param defStyle
     */
    protected void init(AttrSet attrs, int defStyle) {

        //Init attrs
        initAttrs(attrs, defStyle);

    }


    /**
     * Init custom attrs.
     *
     * @param attrs
     * @param defStyle
     */
    protected void initAttrs(AttrSet attrs, int defStyle) {
        list_card_layout_resourceID = ResourceTable.Layout_list_card_layout;
        if (attrs.getAttr("card_header_layout_resourceID").isPresent()) {
            list_card_layout_resourceID = attrs.getAttr("list_card_layout_resourceID").get().getIntegerValue();
        }
    }

    //--------------------------------------------------------------------------
    // Adapter
    //--------------------------------------------------------------------------

    /**
     * Forces to use a {@link CardGridArrayAdapter}
     *
     * @param adapter
     */

    public void setAdapter(BaseItemProvider adapter) {
        if (adapter instanceof CardGridArrayAdapter) {
            setAdapter((CardGridArrayAdapter) adapter);
        } else if (adapter instanceof CardGridCursorAdapter) {
            setAdapter((CardGridCursorAdapter) adapter);
        } else {
            HiLog.warn(Constants.LABEL_LOG,TAG, "You are using a generic adapter. Pay attention: your adapter has to call cardGridArrayAdapter#getView method.");
            setItemProvider(adapter);
        }
    }

    /**
     * Set {@link CardGridArrayAdapter} and layout used by items in ListView
     *
     * @param adapter {@link CardGridArrayAdapter}
     */
    public void setAdapter(CardGridArrayAdapter adapter) {
        setItemProvider(adapter);

        //Set Layout used by items
        adapter.setRowLayoutId(list_card_layout_resourceID);

        adapter.setCardGridView(this);
        mAdapter = adapter;
    }

    /**
     * Set {@link CardGridCursorAdapter} and layout used by items in ListView
     *
     * @param adapter {@link CardGridCursorAdapter}
     */
    public void setAdapter(CardGridCursorAdapter adapter) {
        setItemProvider(adapter);

        //Set Layout used by items
        adapter.setRowLayoutId(list_card_layout_resourceID);

        adapter.setCardGridView(this);
        mCursorAdapter = adapter;
    }

    /**
     * You can use this method, if you are using external adapters.
     * Pay attention. The generic adapter#getView() method has to call the cardArrayAdapter#getView() method to work.
     *
     * @param adapter              {@link } generic adapter
     * @param cardGridArrayAdapter {@link CardGridArrayAdapter} cardGridArrayAdapter
     */
    public void setExternalAdapter(BaseItemProvider adapter, CardGridArrayAdapter cardGridArrayAdapter) {

        setAdapter(adapter);

        mAdapter = cardGridArrayAdapter;
        mAdapter.setCardGridView(this);
        mAdapter.setRowLayoutId(list_card_layout_resourceID);
    }

    /**
     * You can use this method, if you are using external adapters.
     * Pay attention. The generic adapter#getView() method has to call the cardCursorAdapter#getView() method to work.
     *
     * @param adapter           {@link } generic adapter
     * @param cardCursorAdapter {@link } cardArrayAdapter
     */
    public void setExternalAdapter(BaseItemProvider adapter, CardGridCursorAdapter cardCursorAdapter) {

        setAdapter(adapter);

        mCursorAdapter = cardCursorAdapter;
        mCursorAdapter.setCardGridView(this);
        mCursorAdapter.setRowLayoutId(list_card_layout_resourceID);
    }

    //--------------------------------------------------------------------------
    // Expand and Collapse animator
    // Don't use this animator in a grid.
    // All cells in the same row should expand/collapse a hidden area of same dimensions.
    //--------------------------------------------------------------------------
    @Override
    public void onExpandStart(CardViewWrapper viewCard, Component expandingLayout) {
        //do nothing. Don't use this kind of animation in a grid
        HiLog.warn(Constants.LABEL_LOG, TAG, "Don't use this kind of animation in a grid");
    }

    @Override
    public void onCollapseStart(CardViewWrapper viewCard, Component expandingLayout) {
        //do nothing. Don't use this kind of animation in a grid
        HiLog.warn(Constants.LABEL_LOG, TAG, TAG, "Don't use this kind of animation in a grid");
    }
}
